<?php
	/**
	 * @author NHN (developers@xpressengine.com)
	 * @package /classes/db/queryparts/condition
	 * @version 0.1
	 */
	class Condition {
		/**
		 * column name
		 * @var string
		 */
		var $column_name;
		var $argument;
		/**
		 * operation can use 'equal', 'more', 'excess', 'less', 'below', 'like_tail', 'like_prefix', 'like', 'notlike_tail',
		 * 'notlike_prefix', 'notlike', 'in', 'notin', 'not_in', 'and', 'or', 'xor', 'not', 'notequal', 'between'
		 * 'null', 'notnull'
		 * @var string
		 */
		var $operation;
		/**
		 * pipe can use 'and', 'or'...
		 * @var string
		 */
		var $pipe;

		var $_value;

                var $_show;
                var $_value_to_string;

		/**
		 * constructor
		 * @param string $column_name
		 * @param mixed $argument
		 * @param string $operation
		 * @param string $pipe
		 * @return void
		 */
		function Condition($column_name, $argument, $operation, $pipe){
			$this->column_name = $column_name;
			$this->argument = $argument;
			$this->operation = $operation;
			$this->pipe = $pipe;

		}

		function getArgument(){
			return null;
		}

		/**
		 * value to string
		 * @param boolean $withValue
		 * @return string
		 */
		function toString($withValue = true){
			if (!isset($this->_value_to_string)) {
				if (!$this->show()) 
				{
					$this->_value_to_string = '';
				}
				else if ($withValue)
				{
					$this->_value_to_string = $this->toStringWithValue();
				}
				else
				{
					$this->_value_to_string = $this->toStringWithoutValue();
				}
			}
			return $this->_value_to_string;
		}

		/**
		 * change string without value
		 * @return string
		 */
		function toStringWithoutValue(){
                    return $this->pipe . ' ' . $this->getConditionPart($this->_value);
		}

		/**
		 * change string with value
		 * @return string
		 */
		function toStringWithValue(){
                    return $this->pipe . ' ' . $this->getConditionPart($this->_value);
		}

		function setPipe($pipe){
			$this->pipe = $pipe;
		}

		/**
		 * @return boolean
		 */
		function show(){
                    if(!isset($this->_show)){
                        if(is_array($this->_value) && count($this->_value) === 1 && $this->_value[0] === '') {
                            $this->_show = false;
                        }
                        else {
                            $this->_show = true;
                            switch($this->operation) {
                                case 'equal' :
                                case 'more' :
                                case 'excess' :
                                case 'less' :
                                case 'below' :
                                case 'like_tail' :
                                case 'like_prefix' :
                                case 'like' :
                                case 'notlike_tail' :
                                case 'notlike_prefix' :
                                case 'notlike' :
                                case 'in' :
                                case 'notin' :
								case 'not_in' :
                                case 'and':
                                case 'or':
                                case 'xor':
                                case 'not':
                                case 'notequal' :
                                        // if variable is not set or is not string or number, return
                                        if(!isset($this->_value)) { $this->_show = false; break;}
                                        if($this->_value === '') { $this->_show = false; break; }
										$tmpArray = array('string'=>1, 'integer'=>1);
                                        if(!isset($tmpArray[gettype($this->_value)]))
										{
											$this->_show = false; break;
										}
                                        break;
                                case 'between' :
                                        if(!is_array($this->_value)) { $this->_show = false; break;}
                                        if(count($this->_value)!=2) {$this->_show = false; break;}
								case 'null':
								case 'notnull':
									break;
								default:
									// If operation is not one of the above, means the condition is invalid
									$this->_show = false;
                            }
                        }
                    }
                    return $this->_show;
		}

		/**
		 * Return condition string
		 * @param int|string|array $value
		 * @return string
		 */
		function getConditionPart($value) {
                    $name = $this->column_name;
                    $operation = $this->operation;

                        switch($operation) {
                            case 'equal' :
                                    return $name.' = '.$value;
                                break;
                            case 'more' :
                                    return $name.' >= '.$value;
                                break;
                            case 'excess' :
                                    return $name.' > '.$value;
                                break;
                            case 'less' :
                                    return $name.' <= '.$value;
                                break;
                            case 'below' :
                                    return $name.' < '.$value;
                                break;
                            case 'like_tail' :
                            case 'like_prefix' :
                            case 'like' :
									if(defined('__CUBRID_VERSION__') 
											&& __CUBRID_VERSION__ >= '8.4.1') 
										return $name.' rlike '.$value;
                                    else
										return $name.' like '.$value;
                                break;
                            case 'notlike_tail' :
                            case 'notlike_prefix' :
                            case 'notlike' :
                                    return $name.' not like '.$value;
                                break;
                            case 'in' :
                                    return $name.' in '.$value;
                                break;
                            case 'notin' :
							case 'not_in' :
                                    return $name.' not in '.$value;
                                break;
                            case 'notequal' :
                                    return $name.' <> '.$value;
                                break;
                            case 'notnull' :
                                    return $name.' is not null';
                                break;
                            case 'null' :
                                    return $name.' is null';
                                break;
                            case 'and' :
                                    return $name.' & '.$value;
                                break;
                            case 'or' :
                                    return $name.' | '.$value;
                                break;
                            case 'xor' :
                                    return $name.' ^ '.$value;
                                break;
                            case 'not' :
                                    return $name.' ~ '.$value;
                                break;
                            case 'between' :
                            return $name.' between ' . $value[0] . ' and ' . $value[1];
                                            break;
                }
            }
	}

?>
